package com.study.spark.scala.broadcast

import org.apache.spark.{SparkConf, SparkContext}

/**
 * 广播变量（在Executor端只读）
 *
 * 1、广播变量只能在Driver端定义，不能在Executor端定义。
 * 2、在Driver端可以修改广播变量的值，在Executor端无法修改广播变量的值。
 * 3、如果executor端用到了Driver的变量，如果不使用广播变量在Executor有多少task就有多少Driver端的变量副本。
 * 4、如果Executor端用到了Driver的变量，如果使用广播变量在每个Executor中只有一份Driver端的变量副本。
 *
 * @author stephen
 * @date 2019-09-27 11:25
 */
object BroadcastDemo {

  def main(args: Array[String]): Unit = {

    val conf = new SparkConf()
      .setMaster("local[*]")
      .setAppName("BroadcastDemo")
    val sc = new SparkContext(conf)

    // 设置广播变量
    val bv = sc.broadcast(1)

    val rdd = sc.makeRDD(Seq(1, 2, 3, 4, 5, 6, 7, 8, 9))
    // 使用广播变量的值
    rdd.map(_+bv.value).foreach(println)

    sc.stop()

  }
}
